home *** CD-ROM | disk | FTP | other *** search
/ MACD 5 / MACD 5.bin / workbench / boot / czesc_2 / toolmanager / source / prefs / button.c < prev    next >
C/C++ Source or Header  |  1993-05-15  |  4KB  |  135 lines

  1. /*
  2.  * button.c  V2.1
  3.  *
  4.  * requester image button code
  5.  *
  6.  * (c) 1990-1993 Stefan Becker
  7.  */
  8.  
  9. #include "ToolManagerConf.h"
  10.  
  11. /* Button image (static) */
  12. __chip static const UWORD FReqImageData[]={
  13.                                            0x03C0,
  14.                                            0x0420,
  15.                                            0xF810,
  16.                                            0xFC10,
  17.                                            0xC3F0,
  18.                                            0xC010,
  19.                                            0xC010,
  20.                                            0xC010,
  21.                                            0xC010,
  22.                                            0xFFF0
  23.                                           };
  24. static struct BitMap FReqImageBitMap={2,10,0,8,0,
  25.                                       (PLANEPTR) FReqImageData,
  26.                                       (PLANEPTR) FReqImageData,
  27.                                       (PLANEPTR) FReqImageData,
  28.                                       (PLANEPTR) FReqImageData,
  29.                                       (PLANEPTR) FReqImageData,
  30.                                       (PLANEPTR) FReqImageData,
  31.                                       (PLANEPTR) FReqImageData,
  32.                                       (PLANEPTR) FReqImageData,};
  33.  
  34. /* Button image (dynamic) */
  35. static ULONG ChipDataSize;
  36. static struct BitMap BitMap;
  37. static struct Image ButtonImage1;
  38. static struct Image ButtonImage2;
  39.  
  40. /* Calculate requester button image */
  41. BOOL CalcReqButtonImage(void)
  42. {
  43.  struct DrawInfo *dri;
  44.  
  45.  if (dri=GetScreenDrawInfo(PublicScreen)) {
  46.   ULONG gheight=ScreenFont->tf_YSize+INTERHEIGHT+2;
  47.   ULONG gdepth=dri->dri_Depth;
  48.   UBYTE *chipdata;
  49.  
  50.   /* Calculate byte count for chip data (Image data are UWORDs!) */
  51.   ChipDataSize=(REQBUTTONWIDTH+15)/16*2*2*gheight*gdepth;
  52.  
  53.   /* Allocate memory for image */
  54.   if (chipdata=AllocMem(ChipDataSize,MEMF_PUBLIC|MEMF_CLEAR|MEMF_CHIP)) {
  55.    ULONG planemask=(1L << gdepth)-1;
  56.    ULONG yoff=(gheight-10)/2;
  57.  
  58.    /* Init Image structure */
  59.    ButtonImage1.LeftEdge=0;
  60.    ButtonImage1.TopEdge=0;
  61.    ButtonImage1.Width=REQBUTTONWIDTH;
  62.    ButtonImage1.Height=gheight;
  63.    ButtonImage1.Depth=gdepth;
  64.    ButtonImage1.PlanePick=planemask;
  65.    ButtonImage1.PlaneOnOff=0;
  66.    ButtonImage1.NextImage=NULL;
  67.    ButtonImage2=ButtonImage1;
  68.    ButtonImage1.ImageData=(UWORD *) chipdata;
  69.    ButtonImage2.ImageData=(UWORD *) (chipdata+ChipDataSize/2);
  70.  
  71.    /* Init graphics structures */
  72.    InitBitMap(&BitMap,gdepth,REQBUTTONWIDTH,gheight);
  73.    InitRastPort(&TmpRastPort);
  74.    TmpRastPort.BitMap=&BitMap;
  75.  
  76.    /* Set plane pointers */
  77.    {
  78.     int i;
  79.     ULONG off=ChipDataSize/gdepth/2;
  80.     UBYTE *pl=(UBYTE *) ButtonImage1.ImageData;
  81.  
  82.     for (i=0; i<gdepth; i++, pl+=off) BitMap.Planes[i]=pl;
  83.    }
  84.  
  85.    /* Draw button image (deselected state) */
  86.    SetRast(&TmpRastPort,dri->dri_Pens[BACKGROUNDPEN]);
  87.    DrawBevelBox(&TmpRastPort,0,0,REQBUTTONWIDTH,gheight,GT_VisualInfo,ScreenVI,
  88.                                                         TAG_DONE);
  89.    BltBitMap(&FReqImageBitMap,0,0,&BitMap,4,yoff,12,10,ANBC,planemask,NULL);
  90.    BltBitMap(&FReqImageBitMap,0,0,&BitMap,4,yoff,12,10,ABC|ABNC|ANBC,
  91.              dri->dri_Pens[TEXTPEN],NULL);
  92.  
  93.    /* Set plane pointers */
  94.    {
  95.     int i;
  96.     ULONG off=ChipDataSize/gdepth/2;
  97.     UBYTE *pl=(UBYTE *) ButtonImage2.ImageData;
  98.  
  99.     for (i=0; i<gdepth; i++, pl+=off) BitMap.Planes[i]=pl;
  100.    }
  101.  
  102.    /* Draw button image (selected state) */
  103.    SetRast(&TmpRastPort,dri->dri_Pens[FILLPEN]);
  104.    DrawBevelBox(&TmpRastPort,0,0,REQBUTTONWIDTH,gheight,GT_VisualInfo,ScreenVI,
  105.                                                         GTBB_Recessed,FALSE,
  106.                                                         TAG_DONE);
  107.    BltBitMap(&FReqImageBitMap,0,0,&BitMap,4,yoff,12,10,ANBC,planemask,NULL);
  108.    BltBitMap(&FReqImageBitMap,0,0,&BitMap,4,yoff,12,10,ABC|ABNC|ANBC,
  109.              dri->dri_Pens[FILLTEXTPEN],NULL);
  110.  
  111.    /* All OK! */
  112.    FreeScreenDrawInfo(PublicScreen,dri);
  113.    return(TRUE);
  114.   }
  115.   FreeScreenDrawInfo(PublicScreen,dri);
  116.  }
  117.  return(FALSE);
  118. }
  119.  
  120. /* Free button images */
  121. void FreeReqButtonImage(void)
  122. {
  123.  FreeMem(ButtonImage1.ImageData,ChipDataSize);
  124. }
  125.  
  126. /* Init requester button */
  127. void InitReqButtonGadget(struct Gadget *g)
  128. {
  129.  g->Flags=GFLG_GADGHIMAGE|GFLG_GADGIMAGE;
  130.  g->Activation=GACT_RELVERIFY;
  131.  g->GadgetType|=GTYP_BOOLGADGET;
  132.  g->GadgetRender=&ButtonImage1;
  133.  g->SelectRender=&ButtonImage2;
  134. }
  135.